﻿namespace 设计模式01
{
    /// <summary>
    /// 单例模式的实现
    /// </summary>
    public class Singleton
    {
        /// <summary>
        /// 定义一个标识确保线程同步
        /// </summary>
        private static readonly object locker = new object();

        /// <summary>
        /// 定义私有构造函数，使外界不能创建该类的实例
        /// </summary>
        private Singleton()
        {
        }
        /// <summary>
        /// 定义一个静态变量保存类的实例
        /// </summary>
        private static Singleton _uniqueInstance;

        /// <summary>
        /// 定义公有方法提供一个全局访问点，同时
        /// 你也可以定义公有属性提供全局访问
        /// </summary>
        /// <returns></returns>
        public static Singleton GetInstance()
        {
            // 当第一个线程运行到这里时，此时会对locker对象加锁
            // 当第二个线程运行该方法时，首先检测对象为加锁状态，
            // 该线程会挂起等到第一个线程解锁 lock语句运行完之后会对该对象解锁
            // 双重锁定只需要一个判断就可以了
            if (_uniqueInstance==null)
            {
                lock (locker)
                {
                    if (_uniqueInstance == null)
                    {
                        _uniqueInstance = new Singleton();
                    }
                }
            }
           
            return _uniqueInstance;
        }

        

    }
}